package com.zsrt.designmodel.ch03;


/**
 * 双重锁
 * 双重锁机制 = 双重同步锁  面试的时候写这个代码
 * 顾名思义，在双重检查锁中，代码会检查两次单例类是否有已存在的实例，一次加锁一次不加锁
 * 一种只在临界区代码加锁的方法。程序员称其为双重检查锁，因为会有两次检查 _instance == null，一次不加锁，另一次在同步块上加锁。
 * 双重检查锁（Double Checked Locking of Singleton）
 * @author zsrt
 *
 */
public class Singleton {
	
	/**
	 * 1 延迟加载 懒加载
	 */
	private volatile static Singleton instance;
	
	/*
	 * 2
	 * 3
	 */
	
	//
	
	/**
	 * 2 提供私有的构造方法
	 */
	private Singleton(){
		
	}
	
	
	
	
	
	
	/**
	 * 3 提供公共的静态的方法  
	 * 
	 * BS   浏览器服务器模型                                                 95%   http://www.12306.cn/mormhweb/ 美团  
	 * CS   客户端服务模型      QQ 装1个客户端 sockect  5%        下午 了解
	 * 双重检查锁 既能相对锁住方法来说可以保证性能 又能保证唯一
	 */
	public static /*synchronized*/ Singleton getSingleton(){
		if(null == instance){
			//Single Checked
			synchronized (Singleton.class) {
				if(null == instance ){
					//Double checked
					instance = new Singleton();
				}
			}
		}
		
		return instance;
	}

}
